home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / C / LIB / YLIB / ylib_0_10 / s / ylib < prev    next >
Text File  |  1993-09-21  |  19KB  |  1,118 lines

  1. ;    s.ylib : routines for math functions
  2. ;
  3. ;    Copyright (C) 1993  Claus Vohwinkel
  4. ;
  5. ;    This program is free software; you can redistribute it and/or modify
  6. ;    it under the terms of the GNU General Public License as published by
  7. ;    the Free Software Foundation; either version 2 of the License , or
  8. ;    (at your option) any later version.
  9. ;
  10. ;    This program is distributed in the hope that it will be useful,
  11. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ;    GNU General Public License for more details.
  14. ;
  15. ;    You should have received a copy of the GNU General Public License
  16. ;    along with this program; see the file COPYING.  If not, write to
  17. ;    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ;
  19. ;    You may contact the author by:
  20. ;       e-mail:  vohwinkel@vxdesy.desy.de
  21. ;      us-mail:  Claus Vohwinkel
  22. ;                SCRI/FSU
  23. ;                400 Science Library
  24. ;                Tallahassee, FL 32306
  25. ;      
  26. ;
  27.  
  28.  GET FPINSTR
  29.  
  30.  
  31. yceil STMFD SP!,{R0,R1}
  32.  LDFD F0,[SP],#8
  33.  URDEP F0,F0
  34.  NRME F0,F0
  35.  MOVS PC,R14
  36.  
  37. yfloor STMFD SP!,{R0,R1}
  38.  LDFD F0,[SP],#8
  39.  URDEM F0,F0
  40.  NRME F0,F0
  41.  MOVS PC,R14
  42.  
  43.  
  44. yfmod STMFD SP!,{R0-R3}
  45.  LDFD F1,[SP,#8]
  46.  TEQ R2,#0
  47.  MNFMIE F1,F1
  48.  LDFD F0,[SP],#16
  49.  DVFEZ F2,F0,F1
  50.  URDEZ F2,F2
  51.  NRME F2,F2
  52.  MUFE F1,F1,F2
  53.  SUFE F0,F0,F1
  54.  MOVS PC,R14
  55.  
  56. ymodf STMFD SP!,{R0,R1}
  57.  LDFD F0,[SP],#8
  58.  URDEZ F1,F0
  59.  NRME F1,F1
  60.  SUFE F0,F0,F1
  61.  STFD F1,[R2]
  62.  MOVS PC,R14
  63.  
  64.  
  65. yacos STMFD SP!,{R14}
  66.  BL yasin
  67.  LDFE F1,PIO2
  68.  SUFE F0,F1,F0
  69.  LDMFD SP!,{PC}^
  70.  
  71. ONE_O_SQT2S DCFS 0.707106781
  72.  
  73. yasin STMFD SP!,{R0,R1,R14}
  74.  LDFD F0,[SP]
  75.  MUFE F0,F0,F0
  76.  RSFE F0,F0,#1
  77.  BL ysqrtf
  78.  LDFD F1,[SP]
  79.  LDFS F2,ONE_O_SQT2S
  80.  ABSE F3,F1
  81.  CMF F3,F2
  82.  BGT yasin1
  83.  DVFE F0,F1,F0
  84.  ADD SP,SP,#8
  85.  LDMFD SP!,{R14}
  86.  B yatanf
  87. yasin1 DVFE F0,F0,F3
  88.  BL yatanf
  89.  LDMFD SP!,{R0,R1,R14}
  90.  LDFE F1,PIO2
  91.  SUFE F0,F1,F0
  92.  TEQ R0,#0
  93.  MNFMIE F0,F0
  94.  MOVS PC,R14
  95.  
  96.  
  97.  
  98.  
  99.  
  100. yatan2 STMFD SP!,{R0-R3}
  101.  LDFD F0,[SP],#8
  102.  LDFD F1,[SP],#8
  103.  BIC R0,R0,#&40000000
  104.  ORR R0,R0,R2,LSR #1
  105.  BIC R0,R0,#&20000000
  106.  ABSE F2,F0
  107.  ABSE F3,F1
  108.  CMF F2,F3
  109.  DVFLEE F0,F2,F3
  110.  DVFGTE F0,F3,F2   ; REVERSE ORDER
  111.  ORRGT R0,R0,#&20000000
  112.  STMFD SP!,{R0,R14}
  113.  BL yatanf
  114.  LDMFD SP!,{R0,R14}
  115.  TST R0,#&20000000
  116.  LDFNEE F1,PIO2
  117.  SUFNEE F0,F1,F0
  118.  MOVS R0,R0,LSL #1
  119.  LDFMIE F1,PI
  120.  SUFMIE F0,F1,F0
  121.  MNFCSE F0,F0
  122.  MOVS PC,R14
  123.  
  124.  
  125. PI & &00004000
  126.    & &C90FDAA2
  127.    & &2168C235
  128.  
  129.  
  130. yatanf
  131.  MFS F0,1,[SP,#-12]!
  132.  LDMFD SP!,{R0-R2}
  133.  TEQ R0,#0
  134.  MNFMIE F0,F0
  135.  BIC R2,R0,#&FF000000
  136.  SUB R2,R2,#&3F00
  137.  SUB R2,R2,#&FF
  138.  MOVS R1,R1,LSL #2 ; WE SKIP THE FIRST DIGIT WHICH IS IMPLIED TO BE ONE.
  139.  ADC R2,R2,R2
  140.  B yatanx
  141.  
  142. ; ------------------------
  143.  
  144. yatan
  145.  STMFD SP!,{R0,R1}
  146.  LDFD F0,[SP],#8
  147.  
  148.  MOV R2,R0,LSL #1
  149.  TEQ R0,#0
  150.  MNFMIE F0,F0          ; WE MUST KEEP R0 FOR SIGN
  151.  MOV R2,R2,LSR #20
  152.  SUB R2,R2,#&FE
  153.  SUB R2,R2,#&700
  154. yatanx CMP R2,#7
  155.  MOVGE R3,#24
  156.  BGE BOK       ; WE ARE IN HIGHEST SECTOR
  157.  RSB R2,R2,#6
  158.  MOV R2,R2,LSL #2 ; * 4
  159.  CMP R2,#32
  160.  LDRLT R3,MASK1
  161.  SUBGE R2,R2,#32
  162.  LDRGE R3,MASK2
  163.  MOV R3,R3,LSR R2
  164.  TST R3,#8
  165.  AND R3,R3,#7
  166.  ADD R3,R3,R3,LSL #1 ; * 3
  167.  BEQ BOK      ; THE BOUND IS OK
  168.  ADR R2,COFFS1
  169.  ADD R2,R2,R3,LSL #2
  170.  MFL F1,1,[R2],#0
  171.  CMF F0,F1
  172.  ADDGT R3,R3,#3
  173. BOK SUBS R3,R3,#3   ; WE MUST KEEP R3 FOR LATER ADDITION OF ATAN(X_I)
  174.   BMI NOCORR
  175.   ; R3 IS LOWER BOUND*3 = 0.. 3*7
  176.      ; TO R3 BELONGS TAN(2*(R3/3+1)*PI/32)
  177.  ADR R2,COFFS2
  178.  ADD R2,R2,R3,LSL #2
  179.  MFL F1,1,[R2],#0
  180.  MUFE F2,F1,F1
  181.  ADFE F0,F1,F0
  182.  ADFE F2,F2,#1
  183.  DVFE F0,F2,F0
  184.  SUFE F0,F1,F0
  185. NOCORR 
  186. ; WE HAVE THE NEW ARG IN F0
  187.  ADR R1,ATCO6
  188.  MUFE F1,F0,F0
  189.  MFL F2,2,[R1],#24
  190.  MOV R2,#4
  191.  MUFE F2,F2,F1
  192.  ADFE F2,F2,F3
  193. ATA2
  194.  MUFE F2,F2,F1
  195.  MFL F3,1,[R1],#12
  196.  SUBS R2,R2,#1
  197.  ADFE F2,F2,F3
  198.  BPL ATA2
  199.  TEQ R3,#0
  200.  ADRPL R2,COFFS3
  201.  MUFE F0,F0,F2
  202.  ADDPL R2,R2,R3,LSL #2
  203.  LFMPL F1,1,[R2],#0
  204.  ADFPLE F0,F0,F1
  205.  TEQ R0,#0
  206.  MNFMIE F0,F0
  207.  MOVS PC,R14
  208.  
  209.  
  210. ATCO6  & &00003FFB
  211.   & &98FCA17B
  212.   & &0B4B4F14
  213. ZCO5  & &80003FFB
  214.   & &BA1F194D
  215.   & &4CBA52FF
  216. ZCO4  & &00003FFB
  217.   & &E38E1ED0
  218.   & &E5D5B014
  219. ZCO3  & &80003FFC
  220.   & &92492486
  221.   & &F9EEBEA5
  222. ZCO2  & &00003FFC
  223.   & &CCCCCCCC
  224.   & &C8200EE7
  225. ZCO1  & &80003FFD
  226.   & &AAAAAAAA
  227.   & &AAAA4DE2
  228. ZCO0  & &00003FFE
  229.   & &FFFFFFFF
  230.   & &FFFFFFFF
  231.  
  232.  
  233. MASK1 & &BCD6E77F    ; CONTAINS MASKS FOR EXP   -5  0   5  1  15  2  25  3
  234.                      ;                           B  C   D  6   E  7   7  F
  235. MASK2 & &0081192A    ;                         -45 -4 -35 -3 -25 -2 -15 -1
  236.                      ;                           0  0   8  1   1  9   2  A
  237. COFFS1             ;TAN( (2*I+1)*PI/32) I = 0..7
  238.  & &00003FFB
  239.   & &C9B5DC62
  240.   & &D96D1310
  241.  & &00003FFD
  242.   & &9B5041AA
  243.   & &E31EDE29
  244.  & &00003FFE
  245.   & &88D5B8C8
  246.   & &41A75C35
  247.  & &00003FFE
  248.   & &D2180157
  249.   & &21427E59
  250.  & &00003FFF
  251.   & &9BF7EC6C
  252.   & &3B03EF3C
  253.  & &00003FFF
  254.   & &EF789DB9
  255.   & &E0A03110
  256.  & &00004000
  257.   & &D2FACF48
  258.   & &3006E648
  259.  & &00004002
  260.   & &A27362CA
  261.   & &D7EE626A
  262. COFFS2         ; 1/TAN(2*(I+1)*PI/32)  I = 0..7
  263.  & &00004001
  264.    & &A0DFF712
  265.    & &123B8845
  266.  & &00004000
  267.    & &9A827999
  268.    & &FCEF3242
  269.  & &00003FFF
  270.    & &BF90C712
  271.    & &D3A30A83
  272.  & &00003FFF
  273.    & &80000000
  274.    & &00000000
  275.  & &00003FFE
  276.    & &AB0DC155
  277.    & &BFCC82F5
  278.  & &00003FFD
  279.    & &D413CCCF
  280.    & &E7799212
  281.  & &00003FFC
  282.    & &CBAFAF02
  283.    & &A98AC03E
  284.  & &00000000
  285.    & &00000000
  286.    & &00000000
  287. COFFS3         ; (I+1)*PI/16  I = 0..7
  288.  & &00003FFC
  289.    & &C90FDAA2
  290.    & &2168C235
  291.  & &00003FFD
  292.    & &C90FDAA2
  293.    & &2168C235
  294.  & &00003FFE
  295.    & &96CBE3F9
  296.    & &990E91A8
  297.  & &00003FFE
  298.    & &C90FDAA2
  299.    & &2168C235
  300.  & &00003FFE
  301.    & &FB53D14A
  302.    & &A9C2F2C2
  303.  & &00003FFF
  304.    & &96CBE3F9
  305.    & &990E91A8
  306.  & &00003FFF
  307.    & &AFEDDF4D
  308.    & &DD3BA9EE
  309. PIO2 & &00003FFF
  310.    & &C90FDAA2
  311.    & &2168C235
  312.  
  313.  
  314. FSQINV TEQ R0,#&80000000
  315.  TEQEQ R2,#0
  316.  TEQEQ R3,#0
  317.  ADD SP,SP,#12
  318.  MOVEQS PC,R14
  319.  TST R0,#&80000000
  320.  MOVEQS R1,R0,LSL #2
  321.  SQTNEE F0,F0
  322.  MOVNES PC,R14
  323.  BIC R0,R0,#&C0000000
  324. FD1 MOVS R3,R3,LSL #1
  325.  ADCS R2,R2,R2
  326.  SUB R0,R0,#1
  327.  BPL FD1
  328.  MOV R1,#&3F00
  329.  ADD R1,R1,#&FF
  330.  STMFD SP!,{R1,R2,R3}
  331.  MFL F0,1,[SP],#12
  332.  SUB R2,R0,R1
  333.  B SQA
  334.  
  335. FZER1 TEQ R0,#0
  336.  TEQEQ R2,#0
  337.  TEQEQ R3,#0
  338.  ADD SP,SP,#12
  339.  MOVEQS PC,R14
  340.  MNFE F0,#1      ; if we arrive here, something is screwed
  341.  SQTE F0,F0
  342.  MOVS PC,R14
  343.  
  344. ysqrtf MFS F0,1,[SP,#-12]!
  345.  LDMIA SP,{R0,R2,R3}
  346.  TST R0,#&C0000000
  347.  BNE  FSQINV
  348.  MOV R1,#&3F00
  349.  ADD R1,R1,#&FF
  350.  STMIA SP,{R1}
  351.  TEQ R2,#0
  352.  BPL FZER1
  353.  MFL F0,1,[SP],#12
  354.  SUB R2,R0,R1
  355.  B SQA
  356.  
  357. ysqrt
  358.  MOVS R2,R0,ASR #20
  359.  BMI SQINVALID
  360.  MOV R3,#&FF
  361.  ORR R3,R3,#&300
  362.  BEQ SQZER_OR_DEN
  363.  BIC R0,R0,R2,LSL #20
  364.  ORR R0,R0,R3,LSL #20
  365.  EOR IP,R2,R3
  366.  TEQ IP,#&400
  367.  BEQ SQOVERFL_OR_NAN     ; THIS MEANS WE HAVE INFINITY OR A NAN ON INPUT
  368. SQ1 STMFD SP!,{R0,R1}
  369.  LDFD F0,[SP],#8
  370.  SUB R2,R2,R3      ; NEW EXPONENT CORRECTION * 2
  371.        
  372. SQA MOV R0,#2
  373.  ADR R1,SQCO3
  374.  LDFS F1,[R1],#4
  375. SQ2
  376.  FMLS F1,F1,F0
  377.  LDFS F2,[R1],#4
  378.  SUBS R0,R0,#1
  379.  ADFE F1,F1,F2
  380.  BPL SQ2
  381.  
  382.  MUFE F2,F1,F1 ; Y0^2
  383.  MOVS R0,R2,ROR #1
  384.  ADDMI R1,R1,#12
  385.  ADFE F3,F2,F0 ; Z = Y0^2 + X
  386.  MUFE F0,F0,F2 ; X*Y0^2
  387.  LDMNEIA R1,{R0,R1,R3}
  388.  MUFE F2,F3,#0.5 ; 0.5*Z
  389.  ADDNE R0,R0,R2,ASR #1
  390.  MUFE F1,F1,F3 ; Y0*Z
  391.  STMNEFD SP!,{R0,R1,R3}
  392.  MUFE F2,F2,F2 ; 1/4*Z^2
  393.  LDFNEE F3,[SP],#12
  394.  ADFE F0,F0,F2
  395.  MUFNEE F0,F0,F3
  396.  DVFE F0,F0,F1
  397.  MOVS PC,R14
  398.  
  399.  
  400. SQCO3 DCFS 0.0249374292634
  401. SQCO2 DCFS -0.182747647015
  402. SQCO1 DCFS 0.787923250524
  403. SQCO0 DCFS 0.369956381214
  404. SO & &00003FFF
  405.    & &80000000
  406.    & &00000000
  407. SX & &00003FFF
  408.    & &B504F333
  409.    & &F9DE6484
  410.  
  411.  
  412. SQZER_OR_DEN ;
  413.  TEQ R0,#0
  414.  TEQEQ R1,#0
  415.  MVFEQE F0,#0
  416.  MOVEQS PC,R14 ; input was zero
  417.  MOV R2,#1
  418. SQNORM MOVS R1,R1,LSL #1
  419.  ADC R0,R0,R0
  420.  SUB R2,R2,#1
  421.  TST R0,#&100000
  422.  BEQ SQNORM
  423. SQNORM1
  424.  ORR R0,R0,R3,LSL #20
  425.  B SQ1
  426.  
  427. SQINVALID TEQ R0,#&80000000
  428.   TEQEQ R1,#0
  429.   MNFEQE F0,#0
  430.   MOVEQS PC,R14
  431.   B CALL_SUP
  432.  
  433. SQOVERFL_OR_NAN ORR R0,R0,#&40000000
  434. CALL_SUP STMFD SP!,{R0,R1}
  435.  LDFD F0,[SP],#8
  436.  SQTE F0,F0
  437.  MOVS PC,R14
  438.  
  439.  
  440. ycosh
  441.  BIC R0,R0,#&80000000
  442.  STMFD SP!,{R0,R14}
  443.  BL yexp
  444.  LDMFD SP!,{R0,R14}
  445.  SUB R0,R0,#&40000000
  446.  CMP R0,#&00400000
  447.  RDFLTE F1,F0,#1
  448.  ADFLTE F0,F0,F1
  449.  MUFE F0,F0,#0.5
  450.  MOVS PC,R14
  451.  
  452. ysinh BIC R2,R0,#&80000000
  453.  SUB R2,R2,#&3F000000
  454.  CMP R2,#&00E00000
  455.  BLT SINHSERIES
  456.  STMFD SP!,{R0,R14}
  457.  BIC R0,R0,#&80000000
  458.  BL yexp
  459.  LDMFD SP!,{R0,R14}
  460.  TEQ R0,#0
  461.  BIC R0,R0,#&80000000
  462.  MNFMIE F0,F0
  463.  SUB R0,R0,#&40000000
  464.  CMP R0,#&00400000
  465.  RDFLTE F1,F0,#1
  466.  SUFLTE F0,F0,F1
  467.  MUFE F0,F0,#0.5
  468.  MOVS PC,R14
  469.  
  470. SINHSERIES STMFD SP!,{R0,R1}
  471.  LDFD F0,[SP],#8
  472.  ADR R1,SINH6
  473.  MFL F2,2,[R1],#24
  474.  MUFE F1,F0,F0  
  475.  MOV R0,#3
  476.  MUFE F2,F2,F1
  477.  ADFE F2,F2,F3
  478. SH2
  479.  MUFE F2,F2,F1
  480.  MFL F3,1,[R1],#12
  481.  SUBS R0,R0,#1
  482.  ADFE F2,F2,F3
  483.  BPL SH2
  484.  MUFE F2,F2,F1
  485.  ADFE F2,F2,#1
  486.  MUFE F0,F0,F2
  487.  MOVS PC,R14
  488.  
  489. SINH6
  490.     & &00003FDE ; 1.6125990519570001E-10
  491.     & &B14EA0C8
  492.     & &7EE9052D
  493.     & &00003FE5 ; 2.5051878502386569E-08
  494.     & &D731A9D6
  495.     & &0661E200
  496.     & &00003FEC ; 2.7557319615149193E-06
  497.     & &B8EF1D56
  498.     & &C0BD5B2B
  499.     & &00003FF2 ; 0.00019841269840928372
  500.     & &D00D00CF
  501.     & &FD9FF161
  502.     & &00003FF8 ; 0.0083333333333334755
  503.     & &88888888
  504.     & &888B16B0
  505.     & &00003FFC ;  0.16666666666666666
  506.     & &AAAAAAAA
  507.     & &AAAAAA08
  508.  
  509. ytanh
  510.  MOV R2,R0,LSR #20
  511.  MOV R2,R2,LSL #20
  512.  BIC R2,R2,#&80000000
  513.  SUB R2,R2,#&3F000000
  514.  SUB R2,R2,#&00F00000
  515.  TEQ R2,   #&40000000
  516.  BEQ TANH3
  517.  CMN R2,#&00300000
  518.  BLT TANHSERIES
  519.  CMP R2,#&00500000
  520.  BLT TANH2
  521.  TEQ R0,#0
  522.  MVFPLE F0,#1
  523.  MNFMIE F0,#1
  524.  MOVS PC,R14
  525. TANH2 STMFD SP!,{R14}
  526.  ADD R0,R0,#&00100000
  527.  BL yexp
  528.  ADFE F1,F0,#1
  529.  SUFE F0,F0,#1
  530.  DVFE F0,F0,F1
  531.  LDMFD SP!,{PC}^
  532.  
  533. TANH3 MOVS R2,R0,LSL #12
  534.  TEQEQ R1,#0
  535.  BNE TANH4
  536.  TEQ R0,#0
  537.  MVFPLE F0,#1
  538.  MNFMIE F0,#1
  539.  MOVS PC,R14
  540. TANH4 STMFD SP!,{R0,R1}  ;  we have a NaN
  541.  LDFD F0,[SP],#8
  542.  EXPE F0,F0
  543.  MOVS PC,R14
  544.  
  545. TWO_O_LN2 & &00004000
  546.           & &B8AA3B29
  547.           & &5C17F0BC
  548.  
  549. TANHSERIES
  550.  STMFD SP!,{R0,R1}
  551.  LDFD F0,[SP],#8
  552.  LDFE F1,TWO_O_LN2
  553.  MUFE F0,F0,F1
  554.  
  555.  ADR R3,EXM1COFFS
  556.  MUFE F1,F0,F0
  557. ; CALCULATE P
  558.  MFL F2,2,[R3],#24   ; P2,P1
  559.  MUFE F2,F2,F1
  560.  ADFE F2,F2,F3
  561.  MUFE F2,F2,F1
  562.  MFL F3,1,[R3],#12   ; P0
  563.  ADFE F2,F2,F3
  564.  MUFE F0,F0,F2       ; x * P
  565.  MFL F2,2,[R3],#24    ;Q1 Q0
  566.  ADFE F2,F1,F2
  567.  MUFE F2,F2,F1
  568.  ADFE F2,F2,F3    ;  Q
  569.  DVFE F0,F0,F2
  570.  MOVS PC,R14
  571.  
  572.  
  573. EXM1COFFS  ; P2 P1 P0 Q1 Q0
  574.    & &00003FF9 ; 0.023094321272953855
  575.    & &BD304D52
  576.    & &E6A303D0
  577.    & &00004003 ; 20.201700006953125
  578.    & &A19D14E4
  579.    & &ABBBB271
  580.    & &00004009 ; 1513.8641730465356
  581.    & &BD3BA74E
  582.    & &3B9E90C8
  583.    & &00004006 ; 233.17823205143102
  584.    & &E92DA09D
  585.    & &9FFECB3E
  586.    & &0000400B ; 4368.0886700674173
  587.    & &8880B598
  588.    & &A6FD8544
  589.  
  590.        
  591. exm1 STMFD SP!,{R0,R1}
  592.  LDFD F0,[SP],#8
  593.  BIC R2,R0,#&80000000
  594.  SUB R2,R2,#&3F000000
  595.  LDFE F1,LOG2E
  596.  CMP R2,#&00D00000
  597.  BGE EXM1L
  598.  MUFE F0,F0,F1
  599. exm1y
  600.  ADR R3,EXM1COFFS
  601.  MUFE F1,F0,F0
  602. ; CALCULATE P
  603.  MFL F2,2,[R3],#24   ; P2,P1
  604.  MUFE F2,F2,F1
  605.  ADFE F2,F2,F3
  606.  MUFE F2,F2,F1
  607.  MFL F3,1,[R3],#12   ; P0
  608.  ADFE F2,F2,F3
  609.  MUFE F0,F0,F2       ; x * P
  610.  MFL F2,2,[R3],#24    ;Q1 Q0
  611.  ADFE F2,F1,F2
  612.  MUFE F2,F2,F1
  613.  ADFE F2,F2,F3    ;  Q
  614.  SUFE F1,F2,F0    ; Q - xP
  615.  MUFE F0,F0,#2    ; 2 x P
  616.  DVFE F0,F0,F1
  617.  MOVS PC,R14
  618.  
  619. EXM1L STMFD SP!,{R14}
  620.  BL yexpf
  621.  SUFE F0,F0,#1
  622.  LDMFD SP!,{PC}^
  623.  
  624. ;      ----------
  625.  
  626. ypow TEQ R0,#0
  627.  BMI POWNEG
  628.  TEQEQ R1,#0
  629.  BEQ POWZER
  630.  STMFD SP!,{R2,R3,R14}
  631.  LDFD F0,[SP]
  632.  URDE F1,F0
  633.  NRME F1,F1
  634.  SUFE F1,F0,F1
  635.  CMF F1,#0
  636.  BNE POWUSU
  637.  ABSE F1,F0
  638.  LDFS F2,POTRESH
  639.  CMF F1,F2
  640.  BGT POWUSU
  641.  
  642.  FIXE R2,F0
  643.  STMIA SP,{R0,R1}
  644.  LDFD F1,[SP],#12   ; WE KILL R14 ON STACK AS WELL
  645.  TEQ R2,#0
  646.  BEQ PPZ
  647.  MVFE F0,#1
  648.  TEQ R2,#0
  649.  MOVEQS PC,R14
  650.  RDFMIE F1,F1,#1
  651.  RSBMI R2,R2,#0
  652.  
  653. POWLOOP MOVS R2,R2,LSR #1
  654.  MUFCSE F0,F0,F1
  655.  MOVEQS PC,R14
  656.  MUFE F1,F1,F1
  657.  B POWLOOP
  658.  
  659. PPZ CMF F1,#0
  660.  ADFVSE F0,F1,#0  ; RETURN IF nan
  661.  MOVVSS PC,R14
  662.  SUB IP,R0,#&0FF00000
  663.  TEQ IP,#&70000000
  664.  BEQ PAWX           ; +- INF ** 0
  665.  MVFE F0,#1
  666.  MOVS PC,R14
  667.  
  668.  
  669. POWNEG
  670.  STMFD SP!,{R0,R1}
  671.  LDFD F2,[SP],#8
  672.  CMF F2,#0
  673.  BVS PNAN
  674.  MOVS IP,R2
  675.  RDFMIE F0,F2,#1
  676.  MVFPLE F0,F2
  677.  BICMIS IP,IP,#&80000000
  678.  TEQEQ R3,#0
  679.  BEQ PMZ
  680.  MVFE F1,F0
  681.  MOV R0,IP,LSL #12
  682.  MOV IP,IP,LSR #20
  683.  SUB IP,IP,#&FF
  684.  TEQ IP,#&700
  685.  BEQ PF1            ;  INF OR NAN
  686.  SUBS IP,IP,#&300
  687.  BMI PF1            ; .. fraction
  688.  ORR R0,R0,R3,LSR #20
  689.  MOV R1,R3,LSL #12
  690.  BEQ PN2
  691. PN1 MUFE F0,F0,F0
  692.  TEQ R0,#0
  693.  MUFMIE F0,F0,F1
  694.  MOVS R1,R1,LSL #1
  695.  ADCS R0,R0,R0
  696.  SUBS IP,IP,#1
  697.  BNE PN1
  698. PN2 TEQ R0,#0
  699.  TEQEQ R1,#0
  700.  MOVEQS PC,R14
  701.  
  702. PF1 MVFE F0,F2      ; original first arg
  703.  STMFD SP!,{R2,R3}
  704.  LDFD F1,[SP],#8 ; original scnd arg
  705.  POWE F0,F0,F1
  706.  MOVS PC,R14
  707.  
  708. PMZ ;  handle (-x)^0
  709.  BICS IP,R0,#&80000000
  710.  TEQEQ R1,#0
  711.  BEQ PAWX      ; (-0)^0
  712.  MOVS IP,IP,LSR #20
  713.  SUBS IP,IP,#&FF
  714.  TEQ IP,#&700
  715.  BEQ PAWX
  716.  MVFE F0,#1
  717.  MOVS PC,R14
  718.  
  719. POWZER ;  handle 0 ^ X
  720.  STMFD SP!,{R2,R3}
  721.  LDFD F0,[SP],#8
  722.  CMF F0,#0
  723.  ADFVSE F0,F0,#1
  724.  MOVVS PC,R14
  725.  BEQ PAWX
  726.  MVFE F0,#0
  727.  RDFMIE F0,F0,#1
  728.  MOVS PC,R14
  729.  
  730. PAWX ; supply an invalid operation
  731.  MNFE F0,#1
  732.  LOGE F0,F0
  733.  MOVS PC,R14
  734.  
  735. PNAN STMFD SP!,{R2,R3}
  736.  LDFD F1,[SP],#8
  737.  ADFE F0,F1,F2
  738.  MOVS PC,R14
  739.  
  740. POWUSU BL ylog
  741.  LDFD F1,[SP],#8
  742.  MUFE F0,F0,F1
  743.  LDMFD SP!,{R14}
  744.  B yexpf
  745.  
  746. POTRESH DCFS 65000.0
  747.  
  748.  
  749.  
  750.  
  751. twotox STMFD SP!,{R0,R1}
  752.  LDFD F0,[SP],#8
  753. twotoxf LDFS F2,TOVT
  754.  ABSE F1,F0
  755.  CMF F1,F2
  756.  ADR R3,P2
  757.  BMI YEXPZ
  758.  B OVER_UNDER
  759.  
  760.  
  761. yexp
  762.  STMFD SP!,{R0,R1}
  763.  LDFD F0,[SP],#8
  764. yexpf LDFS F2,OVT
  765.  ABSE F3,F0
  766.  ADR R3,LOG2E
  767.  MFL F1,1,[R3],#12
  768.  CMF F3,F2
  769.  MUFE F0,F0,F1
  770.  BPL OVER_UNDER
  771. YEXPZ URDE F1,F0
  772.  NRME F1,F1    
  773.  
  774.  FIXE R2,F1
  775.  
  776.  SUFE F0,F0,F1
  777. ; -1/2 <= F0 <= 1/2
  778.  MUFE F1,F0,F0
  779. ; CALCULATE P
  780.  MFL F2,2,[R3],#24   ; P2,P1
  781.  MUFE F2,F2,F1
  782.  ADFE F2,F2,F3
  783.  MUFE F2,F2,F1
  784.  MFL F3,1,[R3],#12   ; P0
  785.  ADFE F2,F2,F3
  786.  MUFE F0,F0,F2
  787.  MFL F2,2,[R3],#24    ;Q1 Q0
  788.  ADFE F2,F1,F2
  789.  MUFE F2,F2,F1
  790.  ADFE F2,F2,F3
  791.  SUFE F1,F2,F0
  792.  ADFE F0,F0,F2
  793.  DVFE F0,F0,F1
  794.  TEQ R2,#0
  795.  
  796.  
  797.  MOVEQS PC,R14
  798.  CMP R2,#&4000
  799.  BGE OVERFL
  800.  ADD R0,R2,#&FF
  801.  ADDS R0,R0,#&3F00
  802.  MOV R1,#&80000000
  803.  MOV R2,#0
  804.  BLE DENORM_OR_ZER
  805. EX2 STMFD SP!,{R0,R1,R2}
  806.  MFL F3,1,[SP],#12
  807.  MUFE F0,F0,F3
  808.  MOVS PC,R14
  809.  
  810. TOVT DCFS 16448.0
  811. OVT DCFS 11400.0
  812. LOG2E & &00003FFF
  813.       & &B8AA3B29
  814.       & &5C17F0BC
  815. P2    & &00003FF9
  816.       & &BD2E42AB
  817.       & &70BDAA7B
  818. P1    & &00004003
  819.       & &A19DD498
  820.       & &9F60DB06
  821. P0    & &00004009
  822.       & &BD3D047F
  823.       & &734DBD67
  824. Q1    & &00004006
  825.       & &E92F287A
  826.       & &E89542C1
  827. Q0    & &0000400B
  828.       & &8881B17C
  829.       & &3A652AD2
  830.  
  831.  
  832. DENORM_OR_ZER
  833.  RSB IP,R0,#1
  834.  MOV R3,#&80000000
  835.  MOV R1,R3,LSR IP
  836.  SUBS IP,IP,#32
  837.  MOVPL R2,R3,LSR IP
  838.  B EX2
  839.  
  840. OVER_UNDER
  841.  BVS ENAN
  842.  CMF F0,#0
  843.  MVFLTE F0,#0
  844.  MOVLTS PC,R14
  845.  ; we would need 2**f0 at this point but we have an overflow so we dont care
  846.  EXPE F0,F0
  847.  MOVS PC,R14
  848. OVERFL
  849.  LDFS F0,TOVT
  850.  EXPE F0,F0
  851.  MOVS PC,R14
  852.  
  853. ENAN ADFE F0,F0,#0
  854.  MOVS PC,R14
  855.  
  856. ; -----------------------------------------------------------
  857.  
  858.  
  859. ylog10 STMFD SP!,{R14}
  860.        BL ylog
  861.        LDFE F1,L10E
  862.        MUFE F0,F0,F1
  863.        LDMFD SP!,{PC}^
  864. L10E & &00003FFD
  865.      & &DE5BD8A9
  866.      & &37287195
  867.  
  868. ylog
  869.  LDFD F1,SQX2
  870.  MOVS R2,R0,ASR #20
  871.  BMI LSUP
  872.  MOV R3,#&FF
  873.  ORR R3,R3,#&300
  874.  BEQ LGZER_OR_DEN
  875.  BIC R0,R0,R2,LSL #20
  876.  ORR R0,R0,R3,LSL #20
  877.  SUB R2,R2,R3           
  878.  TEQ R2,#&400          ; INFINITY OR NAN AS INPUT
  879.  BEQ LSUP1
  880. LN1 STMFD SP!,{R0,R1}
  881.  LDFD F0,[SP],#8
  882.  
  883. ; F0 IS NOW BETWEEN 1 AND 2
  884. ; F1 CONTAINS SQRT2
  885. ; R2 IS ORIGINAL EXPONENT
  886.  CMF F0,F1
  887.  MUFGTE F0,F0,#0.5
  888.  ADDGT R2,R2,#1
  889. ; WE NEED NOW F0 = (F0-1)/(1+F0)
  890.  SUFE F1,F0,#1
  891.  ADFE F2,F0,#1
  892.  ADR R1,LGCO7
  893.  DVFE F0,F1,F2
  894.  MFL F2,2,[R1],#24
  895.  MUFE F1,F0,F0  
  896.  MOV R0,#5
  897.  MUFE F2,F2,F1
  898.  ADFE F2,F2,F3
  899. LG2
  900.  MUFE F2,F2,F1
  901.  MFL F3,1,[R1],#12
  902.  SUBS R0,R0,#1
  903.  ADFE F2,F2,F3
  904.  BPL LG2
  905.  TEQ R2,#0
  906.  MUFE F0,F0,F2
  907.  FLTNEE F1,R2
  908.  MOVEQS PC,R14
  909.  LFM F3,1,[R1],#12
  910.  MUFE F1,F1,F3
  911.  ADFE F0,F0,F1
  912.  MOVS PC,R14
  913.  
  914. SQX2 DCFD 1.41421356237309504880
  915. LGCO7    & &00003FFC
  916.        & &98AA3FC1
  917.        & &56F198AE
  918. ZCO6    & &00003FFC
  919.        & &9CB03E62
  920.        & &9FC48DB6
  921.        & &00003FFC
  922.        & &BA34901A
  923.        & &A65F3672
  924.        & &00003FFC
  925.        & &E38E20BB
  926.        & &67572CF5
  927.        & &00003FFD
  928.        & &924924AD
  929.        & &BBFE1303
  930.        & &00003FFD
  931.        & &CCCCCCCC
  932.        & &ABC1FB26
  933.        & &00003FFE
  934.        & &AAAAAAAA
  935.        & &AAB39730
  936.        & &00003FFF
  937.        & &FFFFFFFF
  938.        & &FFFFFF4C
  939. LOG2   & &00003FFE
  940.        & &B17217F7
  941.        & &D1CF79AC
  942.  
  943.  
  944. LGZER_OR_DEN ;
  945.  TEQ R0,#0
  946.  TEQEQ R1,#0
  947.  MVFEQE F0,#0
  948.  BEQ LSP1      ; input was zero
  949.  RSB R2,R3,#1
  950. LGNORM MOVS R1,R1,LSL #1
  951.  ADC R0,R0,R0
  952.  SUB R2,R2,#1
  953.  TST R0,#&100000
  954.  BEQ LGNORM
  955. LGNORM1
  956.  ORR R0,R0,R3,LSL #20
  957.  B LN1
  958.  
  959. LSUP1 ADD R0,R0,#&40000000
  960. LSUP STMFD SP!,{R0,R1}
  961.      LDFD F0,[SP],#8
  962. LSP1 LGNE F0,F0
  963.      MOVS PC,R14
  964.  
  965.  
  966. ycos STMFD SP!,{R0,R1}
  967.  LDFD F0,[SP],#8
  968.  ADR R1,sCO8
  969.  MFL F1,1,[R1,#-12]
  970.  MUFE F0,F1,F0
  971.  RSFE F0,F0,#0.5
  972.  B YSIN1
  973.  
  974. ysin STMFD SP!,{R0,R1}
  975.  LDFD F0,[SP],#8
  976.  ADR R1,sCO8
  977.  MFL F1,1,[R1,#-12]
  978.  MUFE F0,F1,F0
  979. YSIN1 MOV R0,R0,LSL #1
  980.  CMP R0,#&83000000
  981.  URDE F1,F0
  982.  MOV R0,#7
  983.  NRME F1,F1
  984.  BHI INVARG
  985.  FIXE R2,F1
  986.  SUFE F0,F0,F1
  987. SIN1 TST R2,#1
  988.  MUFE F1,F0,F0
  989.  MFL F2,1,[R1],#12
  990.  MNFNEE F0,F0
  991. SIN2
  992.  MUFE F2,F2,F1
  993.  MFL F3,1,[R1],#12
  994.  SUBS R0,R0,#1
  995.  ADFE F2,F2,F3
  996.  BPL SIN2
  997.  MUFE F0,F0,F2
  998.  MOVS PC,R14
  999.  
  1000. INVARG 
  1001.  CMF F0,#0
  1002.  BVS SINAN
  1003.  SUFE F0,F0,F1   
  1004.  MUFE F1,F1,#0.5    ; = -1  -.5  0  .5  1
  1005.  URDE F2,F1
  1006.  NRME F2,F2         ; = -1  -1/0 0  0/1  1
  1007.  SUFE F1,F1,F2      ; = 0   +-.5 0  +-.5 0
  1008.  MUFE F1,F1,#2      ; = 0   +-1  0  +-1  0
  1009.  FIXE R2,F1
  1010.  B SIN1
  1011.  
  1012.  
  1013. OPI    & &00003FFD   ; 1/PI
  1014.        & &A2F9836E
  1015.        & &4E44152A
  1016. sCO8 & &00003FEA
  1017.     & &CE789708
  1018.     & &343B50C6
  1019. sCO7 & &80003FEF
  1020.     & &B7BC195F
  1021.     & &5A69B150
  1022. sCO6 & &00003FF3
  1023.     & &F479AB60
  1024.     & &12957FD1
  1025. sCO5 & &80003FF7
  1026.     & &F183A6E1
  1027.     & &E13B382E
  1028. sCO4 & &00003FFB
  1029.     & &A83C1A42
  1030.     & &75F16822
  1031. sCO3 & &80003FFE
  1032.     & &99696673
  1033.     & &137E85C4
  1034. sCO2 & &00004000
  1035.     & &A335E33B
  1036.     & &AD531C80
  1037. sCO1 & &80004001
  1038.     & &A55DE731
  1039.     & &2DF290FD
  1040. sCO0 & &00004000
  1041.     & &C90FDAA2
  1042.     & &2168C231
  1043.  
  1044. SINAN ADFE F0,F0,#0
  1045.  MOVS PC,R14
  1046. ; ------------------
  1047. ytan STMFD SP!,{R0,R1}
  1048.  LDFD F0,[SP],#8
  1049.  LDFE F1,OPI
  1050.  MUFE F0,F1,F0
  1051.  URDE F1,F0
  1052.  NRME F1,F1
  1053.  SUFE F0,F0,F1
  1054.  LDFS F1,ONE_O_FOUR
  1055.  MOV R2,#0
  1056.  CMF F0,F1
  1057.  RSFGTE F0,F0,#0.5
  1058.  MOVGT R2,#1
  1059.  CNF F0,F1
  1060.  MNFLTE F0,F0
  1061.  SUFLTE F0,F0,#0.5 
  1062.  MOVLT R2,#1
  1063.  MUFE F1,F0,F0
  1064.  ADR R1,TANCOFFS   ; 4286  P3 P2 P1 P0 Q3 Q2 Q1 Q0
  1065.  LDFE F2,[R1],#12
  1066.  MOV R0,#2
  1067. TAN2
  1068.  MUFE F2,F2,F1
  1069.  LDFE F3,[R1],#12
  1070.  SUBS R0,R0,#1
  1071.  ADFE F2,F2,F3
  1072.  BPL TAN2
  1073.  MUFE F0,F0,F2   ; x*P
  1074.  LDFE F2,[R1],#12
  1075.  MOV R0,#2
  1076.  ADFE F2,F1,F2   ; x^2 + q(3)
  1077. TAN3
  1078.  MUFE F2,F2,F1
  1079.  LDFE F3,[R1],#12
  1080.  SUBS R0,R0,#1
  1081.  ADFE F2,F2,F3
  1082.  BPL TAN3
  1083.  TST R2,#1
  1084.  DVFEQE F0,F0,F2
  1085.  DVFNEE F0,F2,F0
  1086.  MOVS PC,R14
  1087.  
  1088.  
  1089. ONE_O_FOUR DCFS 0.25
  1090. TANCOFFS
  1091.     & &80004002 ; -2   -45.649319438665628
  1092.     & &B698E731
  1093.     & &E6E763D6
  1094.     & &00004006 ; -6   14189.854252761779
  1095.     & &DDB76AC1
  1096.     & &3C696C66
  1097.     & &80004008 ; -a -895888.44006768044
  1098.     & &DAB9070A
  1099.     & &84687642
  1100.     & &00004008 ; -e   10888600.437281687
  1101.     & &A625986F
  1102.     & &F1B1530C
  1103.     & &80004004 ; -4  -1014.6561902528854
  1104.     & &FDA9FF05
  1105.     & &67062D0D
  1106.     & &00004008 ; -8    135382.71280511908
  1107.     & &8435AD9E
  1108.     & &995CBB7B
  1109.     & &80004008 ; -c   -3991309.518035165
  1110.     & &F39C3612
  1111.     & &77CF7200
  1112.     & &00004006 ; -10    13863796.663567629
  1113.     & &D38B74A9
  1114.     & &DF9171F3
  1115.  
  1116.  
  1117.  END
  1118.